/**
 * 
 */
package com.kclmedu.forhelp.data;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JCheckBox;
import javax.swing.table.AbstractTableModel;

import org.apache.log4j.Logger;

/**
 * @author Administrator
 *
 */
public class MyTableData extends AbstractTableModel {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5745602177803581264L;

	//日志器
	private static final Logger LOGGER = Logger.getLogger(MyTableData.class);
	
	//存储了所有的二维数据
	private List<List<String>> datas; 
	
	private int rows;
	
	private int cols;
	
	/** 用来存放第一行中所有的复选框组件 */
	private List<JCheckBox> checkBoxes;
	
	//
	public MyTableData(List<List<String>> datas) {
		super();
		LOGGER.debug("构造表格对象");
		this.datas = datas;
		LOGGER.debug("填充的数据集合");
		//根据这个集合来初始化行和列
		this.rows = this.datas.size();
		this.cols = this.datas.get(0).size();
		//
		LOGGER.debug("此表格的行数是："+this.rows);
		LOGGER.debug("此表格的列数是："+this.cols);
		
		//初始化checkBoxes
		LOGGER.debug("开始初始化第一行的复选框组件");
		this.checkBoxes = new ArrayList<>();
		//循环初始化
		for(int i= 0;i < this.cols;i++) {
			JCheckBox box = new JCheckBox();
			this.checkBoxes.add(box);
		}
		LOGGER.debug("初始化完成，第一行中共有："+this.checkBoxes.size()+" 个复选框...");
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getColumnCount()
	 */
	@Override
	public int getColumnCount() {
		//返回列长度
		return this.cols;
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getRowCount()
	 */
	@Override
	public int getRowCount() {
		//返回行长度
		return this.rows;
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getValueAt(int, int)
	 */
	@Override
	public Object getValueAt(int row, int col) {
		LOGGER.debug(">>> 调用getValueAt方法...");
		//第一行的所有元素全部变成 jcheckbox
		if(row == 0) {
			//
			//从事先初始化好的集合中取出来
			JCheckBox jcb = this.checkBoxes.get(col);
			//设置文本
			jcb.setText(this.datas.get(row).get(col));
			//
			LOGGER.info("第一行中全部都是JCheckBox,当前的复选框文字是："+jcb.getText());
			return jcb;
			
		} else {
			Object value = null;
			//判断
			if(row < 0 || col < 0 || row >= this.rows || col >= this.cols) {
				;
				
			} else {
				List<String> tmpList = this.datas.get(row);
				//非空判断
				if(tmpList != null && tmpList.size() >= this.cols - 2) {
					value = tmpList.get(col);
				}
				LOGGER.info("当前所在行："+row+",列："+col+" -> 单元格内的值："+(value == null ? "" : value.toString()));
			}
			//获取所在的行和列的值
			return value;
		}
		
	}
	
	/********
	 * 只允许第一行是可以编辑的
	 * @param row
	 * @param col
	 * @return
	 */
	@Override
	public boolean isCellEditable(int row, int col) {
		//只有第一行中的复选框可以编辑，其它行不允许编辑
		return row == 0;
	}

	/************
	 * 此方法可以不重写，此处只是为了调试和验证单元格内数据类型的正确性
	 * @param value
	 * @param row
	 * @param col
	 */
	@Override
	public void setValueAt(Object value, int row, int col) {
		//保持状态
		JCheckBox jcb = (JCheckBox) value;
		LOGGER.info("->->-> 调用表格模型的setValueAt方法："+jcb.getText()+":"+jcb.isSelected()+" => "+row+","+col);
		jcb.setSelected(jcb.isSelected());
		LOGGER.info("在SetValueAt方法中的Value 哈希码值 : "+jcb.hashCode());
	}

	
}
